Разгърнете силата на Pandas GroupBy за анализ на данни. Това ръководство изследва техники за агрегиране и трансформация с практически примери за международни данни.
Овладяване на операциите Pandas GroupBy: Агрегиране срещу Трансформация
Pandas, крайъгълен камък в манипулацията на данни в Python, предлага мощен инструмент за анализ и разбиране на данни: операцията GroupBy. Тази функция ви позволява да сегментирате данните си в групи въз основа на общи характеристики и след това да прилагате функции към тези групи, разкривайки прозрения, които иначе биха останали скрити. Тази статия навлиза в дълбочина в две основни операции на GroupBy: агрегиране и трансформация, предоставяйки практически примери и обяснения, подходящи за специалисти по данни по целия свят.
Разбиране на концепцията GroupBy
В основата си, GroupBy е процес, който включва три основни стъпки: разделяне на данните в групи въз основа на един или повече критерии, прилагане на функция към всяка група независимо и комбиниране на резултатите в нова структура от данни. Тази стратегия "разделяне-прилагане-комбиниране" е фундаментална концепция в анализа на данни и осигурява гъвкава рамка за изследване на сложни набори от данни.
Силата на GroupBy се крие в способността му да обработва различни типове и структури от данни, което го прави приложим в различни области. Независимо дали анализирате данни за продажби от множество региони, показания от сензори от различни устройства или активност в социалните медии в различни демографски групи, GroupBy може да ви помогне да извлечете значими прозрения.
Агрегиране: Обобщаване на данни в групи
Агрегирането е процес на изчисляване на обобщени статистики за всяка група. Тези статистики предоставят кратък преглед на характеристиките на групата, което ви позволява да сравнявате и противопоставяте различни сегменти от вашите данни. Често срещани агрегиращи функции включват:
sum(): Изчислява сумата от стойностите във всяка група.mean(): Изчислява средната стойност във всяка група.median(): Изчислява средната (медианна) стойност във всяка група.min(): Намира минималната стойност във всяка група.max(): Намира максималната стойност във всяка група.count(): Брои броя на непразните стойности във всяка група.size(): Връща размера на всяка група (включително празните).std(): Изчислява стандартното отклонение във всяка група.var(): Изчислява дисперсията във всяка група.
Практически примери за агрегиране
Нека разгледаме набор от данни за международни продажби на хипотетична компания за електронна търговия. Данните включват информация за продуктовата категория, държавата на продажба и сумата на продажбите.
import pandas as pd
# Sample data
data = {
'Category': ['Electronics', 'Clothing', 'Electronics', 'Clothing', 'Home Goods', 'Electronics', 'Clothing', 'Home Goods'],
'Country': ['USA', 'UK', 'Canada', 'USA', 'Germany', 'UK', 'Canada', 'Germany'],
'Sales': [100, 50, 75, 60, 80, 90, 45, 70]
}
df = pd.DataFrame(data)
print(df)
Това ще изведе:
Category Country Sales
0 Electronics USA 100
1 Clothing UK 50
2 Electronics Canada 75
3 Clothing USA 60
4 Home Goods Germany 80
5 Electronics UK 90
6 Clothing Canada 45
7 Home Goods Germany 70
Пример 1: Изчисляване на общите продажби по категория
За да изчислим общите продажби за всяка продуктова категория, можем да използваме метода groupby(), последван от агрегиращата функция sum().
category_sales = df.groupby('Category')['Sales'].sum()
print(category_sales)
Това ще изведе:
Category
Clothing 155
Electronics 265
Home Goods 150
Name: Sales, dtype: int64
Пример 2: Изчисляване на средните продажби по държава
По подобен начин, за да изчислим средните продажби по държава, можем да използваме агрегиращата функция mean().
country_sales = df.groupby('Country')['Sales'].mean()
print(country_sales)
Това ще изведе:
Country
Canada 60.0
Germany 75.0
UK 70.0
USA 80.0
Name: Sales, dtype: float64
Пример 3: Използване на множество агрегиращи функции
Pandas ви позволява да прилагате едновременно множество агрегиращи функции, използвайки метода agg(). Това осигурява изчерпателно обобщение на характеристиките на групата.
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', 'median', 'count'])
print(category_summary)
Това ще изведе:
sum mean median count
Category
Clothing 155 51.666667 50.0 3
Electronics 265 88.333333 90.0 3
Home Goods 150 75.000000 75.0 2
Пример 4: Персонализирани агрегиращи функции
Можете също така да дефинирате свои собствени персонализирани агрегиращи функции, използвайки ламбда изрази или именувани функции. Това ви позволява да изчислявате специфични статистики, които не са налични в стандартните агрегиращи функции.
# Custom function to calculate the range (max - min)
def custom_range(x):
return x.max() - x.min()
category_summary = df.groupby('Category')['Sales'].agg(['sum', 'mean', custom_range])
print(category_summary)
Това ще изведе:
sum mean custom_range
Category
Clothing 155 51.666667 15
Electronics 265 88.333333 25
Home Goods 150 75.000000 10
Трансформация: Модифициране на данни в групи
Трансформацията, от друга страна, включва модифициране на данните във всяка група въз основа на някакво изчисление. За разлика от агрегирането, което връща обобщена стойност за всяка група, трансформацията връща стойност за всеки ред от оригиналните данни, но стойността се изчислява въз основа на групата, към която принадлежи този ред. Операциите по трансформация запазват оригиналния индекс и формата на DataFrame.
Често срещани случаи на употреба за трансформация включват:
- Стандартизиране на данни във всяка група.
- Изчисляване на ранг или персентил във всяка група.
- Попълване на липсващи стойности въз основа на групови статистики.
Практически примери за трансформация
Нека продължим с нашите международни данни за продажби. Можем да приложим трансформация, за да извършим изчисления, свързани с данните за продажбите във всяка страна.
Пример 1: Стандартизиране на данните за продажбите във всяка държава (Z-score)
Стандартизирането на данни включва трансформиране на стойностите, така че да имат средна стойност 0 и стандартно отклонение 1. Това е полезно за сравняване на данни в различни мащаби и разпределения. Можем да използваме метода transform() заедно с ламбда израз, за да постигнем това.
from scipy.stats import zscore
df['Sales_Zscore'] = df.groupby('Country')['Sales'].transform(zscore)
print(df)
Това ще изведе:
Category Country Sales Sales_Zscore
0 Electronics USA 100 1.000000
1 Clothing UK 50 -1.000000
2 Electronics Canada 75 1.000000
3 Clothing USA 60 -1.000000
4 Home Goods Germany 80 1.000000
5 Electronics UK 90 1.000000
6 Clothing Canada 45 -1.000000
7 Home Goods Germany 70 -1.000000
Колоната Sales_Zscore вече съдържа стандартизираните стойности на продажбите за всяка държава. Стойностите над 0 са над средните продажби за тази държава, а стойностите под 0 са под средните.
Пример 2: Изчисляване на ранг на продажбите във всяка категория
За да изчислим ранга на всяка продажба в рамките на нейната категория, можем да използваме метода rank() във функцията transform().
df['Sales_Rank'] = df.groupby('Category')['Sales'].transform(lambda x: x.rank(method='dense'))
print(df)
Това ще изведе:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA 100 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA 60 -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
Колоната Sales_Rank показва ранга на всяка продажба в съответната ѝ категория. Аргументът `method='dense'` гарантира, че последователните рангове се присвояват без пропуски.
Пример 3: Попълване на липсващи стойности въз основа на средната стойност на групата
Нека въведем някои липсващи стойности в данните за продажбите и след това да ги попълним въз основа на средните продажби за всяка страна.
import numpy as np
# Introduce missing values
df.loc[[0, 3], 'Sales'] = np.nan
print(df)
# Fill missing values based on country mean
df['Sales_Filled'] = df['Sales'].fillna(df.groupby('Country')['Sales'].transform('mean'))
print(df)
Първоначалният DataFrame с липсващи стойности би изглеждал така:
Category Country Sales Sales_Zscore Sales_Rank
0 Electronics USA NaN 1.000000 3.0
1 Clothing UK 50 -1.000000 2.0
2 Electronics Canada 75 1.000000 1.0
3 Clothing USA NaN -1.000000 3.0
4 Home Goods Germany 80 1.000000 2.0
5 Electronics UK 90 1.000000 2.0
6 Clothing Canada 45 -1.000000 1.0
7 Home Goods Germany 70 -1.000000 1.0
И след попълване на липсващите стойности:
Category Country Sales Sales_Zscore Sales_Rank Sales_Filled
0 Electronics USA NaN 1.000000 3.0 NaN
1 Clothing UK 50 -1.000000 2.0 50.0
2 Electronics Canada 75 1.000000 1.0 75.0
3 Clothing USA NaN -1.000000 3.0 NaN
4 Home Goods Germany 80 1.000000 2.0 80.0
5 Electronics UK 90 1.000000 2.0 90.0
6 Clothing Canada 45 -1.000000 1.0 45.0
7 Home Goods Germany 70 -1.000000 1.0 70.0
Важна забележка: Тъй като нямаше съществуваща средна стойност за `USA`, получените стойности в `Sales_Filled` са `NaN`. Обработката на гранични случаи като този е от решаващо значение за надежден анализ на данни и трябва да се има предвид по време на имплементацията.
Агрегиране срещу Трансформация: Ключови разлики
Въпреки че както агрегирането, така и трансформацията са мощни операции на GroupBy, те служат за различни цели и имат отчетливи характеристики:
- Форма на изхода: Агрегирането намалява размера на данните, връщайки една стойност за всяка група. Трансформацията запазва оригиналния размер на данните, връщайки трансформирана стойност за всеки ред.
- Цел: Агрегирането се използва за обобщаване на данни и придобиване на прозрения за характеристиките на групата. Трансформацията се използва за модифициране на данни в групи, често за стандартизация или нормализация.
- Връщана стойност: Агрегирането връща нов DataFrame или Series с агрегираните стойности. Трансформацията връща Series с трансформираните стойности, които след това могат да бъдат добавени като нова колона към оригиналния DataFrame.
Изборът между агрегиране и трансформация зависи от вашите специфични аналитични цели. Ако трябва да обобщите данни и да сравните групи, агрегирането е подходящият избор. Ако трябва да модифицирате данни в групи, като същевременно запазвате оригиналната структура на данните, трансформацията е по-добрият вариант.
Разширени техники на GroupBy
Отвъд основните агрегиране и трансформация, Pandas GroupBy предлага редица разширени техники за по-сложен анализ на данни.
Прилагане на персонализирани функции с apply()
Методът apply() осигурява най-голяма гъвкавост, позволявайки ви да прилагате всяка персонализирана функция към всяка група. Тази функция може да извършва всяка операция, включително агрегиране, трансформация или дори по-сложни изчисления.
def custom_function(group):
# Calculate the sum of sales for each category in a group, only if there is more than one row in the group
if len(group) > 1:
group['Sales_Sum'] = group['Sales'].sum()
else:
group['Sales_Sum'] = 0 # Or some other default value
return group
df_applied = df.groupby('Country').apply(custom_function)
print(df_applied)
В този пример дефинираме персонализирана функция, която изчислява сумата от продажбите във всяка група (държава). Методът apply() прилага тази функция към всяка група, което води до нова колона, съдържаща сумата от продажбите за тази група.
Важна забележка: Функцията apply може да бъде по-интензивна от гледна точка на изчисления в сравнение с другите методи. Оптимизирайте кода си и обмислете алтернативни имплементации, когато работите с мащабни набори от данни.
Групиране по множество колони
Можете да групирате данните си по множество колони, за да създадете по-детайлни сегменти. Това ви позволява да анализирате данни въз основа на пресичането на множество характеристики.
category_country_sales = df.groupby(['Category', 'Country'])['Sales'].sum()
print(category_country_sales)
Това ще групира данните както по Category, така и по Country, което ви позволява да изчислите общите продажби за всяка категория във всяка страна. Това осигурява по-подробен преглед на ефективността на продажбите в различни региони и продуктови линии.
Итерация през групи
За по-сложен анализ можете да итерирате през групите, използвайки цикъл for. Това ви позволява да получите достъп до всяка група поотделно и да извършвате персонализирани операции върху нея.
for name, group in df.groupby('Category'):
print(f"Category: {name}")
print(group)
Това ще итерира през всяка продуктова категория и ще отпечата съответните данни. Това може да бъде полезно за извършване на персонализиран анализ или генериране на отчети за всяка категория.
Най-добри практики за използване на GroupBy
За да осигурите ефективно и ефикасно използване на GroupBy, разгледайте следните най-добри практики:
- Разберете данните си: Преди да приложите
GroupBy, отделете време, за да разберете данните си и да идентифицирате съответните критерии за групиране и функции за агрегиране/трансформация. - Изберете правилната операция: Внимателно преценете дали агрегирането или трансформацията е подходящият избор за вашите аналитични цели.
- Оптимизирайте за производителност: За големи набори от данни, помислете за оптимизиране на кода си, като използвате векторизирани операции и избягвате ненужни цикли.
- Обработка на липсващи стойности: Бъдете наясно с липсващите стойности във вашите данни и ги обработвайте по подходящ начин, използвайки методи като
fillna()илиdropna(). - Документирайте кода си: Документирайте ясно кода си, за да обясните целта на всяка операция
GroupByи обосновката зад вашите избори.
Заключение
Pandas GroupBy е мощен инструмент за анализ на данни, който ви позволява да сегментирате данните си, да прилагате функции към всяка група и да извличате ценни прозрения. Чрез овладяване на техниките за агрегиране и трансформация можете да разгърнете пълния потенциал на вашите данни и да придобиете по-задълбочено разбиране на основните модели и тенденции. Независимо дали анализирате данни за продажби, показания от сензори или активност в социалните медии, GroupBy може да ви помогне да вземате решения, базирани на данни, и да постигнете вашите аналитични цели. Прегърнете силата на GroupBy и издигнете уменията си за анализ на данни на следващото ниво.
Това ръководство предостави изчерпателен преглед на операциите на Pandas GroupBy с фокус върху агрегирането срещу трансформацията. Използвайки тези техники върху международни данни, специалистите по данни по целия свят могат да извличат ключови бизнес прозрения от различни набори от данни. Практикувайте, експериментирайте и адаптирайте тези техники към вашите специфични нужди, за да използвате пълния потенциал на Pandas.